package chapter02.part04;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 输入输出流关心的是文件内容
 * Path Paths File Files 关心文件在磁盘上的存储
 * 主要了解一下各种操作函数
 * 
 * @author insight
 * @since 2021/8/18
 */
public class PathTest {
    public static void main(String[] args) {
        // Path 可以表示目录序列 或 文件名
        // 以根路径开始就是绝对路径 否则就是相对路径
        // 参数列表是可变的 使用默认的分隔符连接起来
        System.out.println(Paths.get("E:", "Learner"));
        System.out.println(Paths.get("src", "main"));
        // 也可以直接一个字符串包含多个部件
        System.out.println(Paths.get("src/main/chapter02"));
        // 路径不必对应实际存在的文件名 不存在也可以使用
        System.out.println(Paths.get("src/main/chapter02/part04/Test.java"));
        
        // 解析路径
        // 如果本身就是绝对路径 直接返回
        // 否则 根据规则 组合路径 比如 q.resolve(p) = q + p
        Path bashDir = Path.of(System.getProperty("user.dir"));
        Path workRelative = Paths.get("work");
        Path workPath = bashDir.resolve(workRelative);
        System.out.println(workPath);
        // 或者直接使用字符串
        workPath = bashDir.resolve("work");
        System.out.println(workPath);
        
        // 创建指定路径的同级路径
        Path resPath = workPath.resolveSibling("resources");
        System.out.println(resPath);
        
        // 创建两个路径的相对关系
        Path path1 = Paths.get("/work/project1");
        Path path2 = Paths.get("/work/project2/src");
        System.out.println(path1.relativize(path2));
        
        // 删除冗余的 . 和 ..
        System.out.println(Paths.get("/home/work/../fred/./input.txt")
                .normalize());
        
        // 产生给定路径的绝对路径
        System.out.println(Paths.get("src/main").toAbsolutePath());
        
        // 提取路径中的各部分
        System.out.println(workPath.getParent());
        System.out.println(workPath.getFileName());
        System.out.println(workPath.getName(1));
        System.out.println(workPath.getRoot());
        
        // 为了兼容 File 类 Path 和 File 可以互转
        File file = workPath.toFile();
        Path path = file.toPath();
    }
}